package com.lining.orangeservice.service.impl;

import com.lining.orangeservice.entity.po.User;
import com.lining.orangeservice.mapper.RoleMapper;
import com.lining.orangeservice.mapper.UserMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 用户详情服务实现类
 * 
 * 作用：
 * 1. 实现Spring Security的UserDetailsService接口
 * 2. 根据用户名加载用户详细信息，包括密码和权限
 * 3. 为Spring Security提供认证和授权所需的核心用户信息
 * 
 * 工作流程：
 * 1. 根据用户名从数据库查询用户基本信息
 * 2. 加载用户的角色信息
 * 3. 将用户角色转换为Spring Security所需的权限格式
 * 4. 构造UserDetails对象返回给Spring Security框架使用
 */
@Service
@RequiredArgsConstructor
public class UserDetailsServiceImpl implements UserDetailsService {

    /**
     * 用户Mapper，用于查询用户基本信息
     */
    private final UserMapper userMapper;
    
    /**
     * 角色Mapper，用于查询用户角色信息
     */
    private final RoleMapper roleMapper;

    /**
     * 根据用户名加载用户详细信息
     * 
     * @param username 用户名
     * @return UserDetails对象，包含用户的用户名、密码和权限信息
     * @throws UsernameNotFoundException 当用户不存在时抛出此异常
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 根据用户名查询用户信息
        User user = userMapper.selectByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("用户不存在: " + username);
        }

        // 加载用户的角色信息
        user.setRoles(roleMapper.selectRolesByUserId(user.getId()));

        // 将用户角色转换为Spring Security所需的权限列表，一个不可变的空列表，不能添加、删除或修改元素
        List<SimpleGrantedAuthority> authorities = Collections.emptyList();
        if (user.getRoles() != null) {
            authorities = user.getRoles().stream()
                    .map(role -> new SimpleGrantedAuthority("ROLE_" + role.getRoleName()))
                    .collect(Collectors.toList());
        }

        // 返回Spring Security的UserDetails实现
        try {
            UserDetails userDetails = org.springframework.security.core.userdetails.User.builder()
                    .username(user.getUsername())           // 设置用户名
                    .password(user.getPassword())            // 设置密码（已加密）
                    .authorities(authorities)                // 设置权限列表
                    .accountExpired(false)                   // 账户是否过期
                    .accountLocked(false)                    // 账户是否锁定
                    .credentialsExpired(false)               // 凭证是否过期
                    .disabled(user.getStatus() == 0)         // 账户是否禁用（状态为0表示禁用）
                    .build();
            return userDetails;
        } catch (Exception e) {
            throw new UsernameNotFoundException("用户不存在: " + username);
        }

    }
}